package funcoesXML;

import biblioteca.Livro;
import biblioteca.Usuario;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.util.*;
import javax.xml.parsers.*;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;

/**
 *
 * @author Gabriel
 */
public class adapterXML {

    private String getChildTagValue(Element elem, String tagName) throws Exception {
        NodeList children = elem.getElementsByTagName(tagName);
        if (children == null) {
            return null;
        }
        Element child = (Element) children.item(0);
        if (child == null) {
            return null;
        }
        return child.getFirstChild().getNodeValue();
    }
    
    public ArrayList<Livro> buscaLivros (String path) throws Exception{
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(path);
        Element el = doc.getDocumentElement();
        NodeList nos = el.getElementsByTagName("livro");
        ArrayList<Livro> lista = new ArrayList();
        for(int i=0; i<nos.getLength(); i++){
            Element tag = (Element) nos.item(i);
            String titulo = getChildTagValue(tag, "titulo");
            String autor = getChildTagValue(tag, "autor");
            String editora = getChildTagValue(tag, "editora");
            int ano = Integer.parseInt(getChildTagValue(tag, "ano"));
            int isbn = Integer.parseInt(getChildTagValue(tag, "isbn"));
            Livro l = new Livro(autor, titulo, editora, isbn, ano);
            lista.add(l);
        }
        return lista;
    }
    public ArrayList<Usuario> buscaUsuario (String path) throws Exception{
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(path);
        Element el = doc.getDocumentElement();
        NodeList nos = el.getElementsByTagName("usuario");
        ArrayList<Usuario> lista = new ArrayList();
        for(int i=0; i<nos.getLength(); i++){
            Element tag = (Element) nos.item(i);
            String nome = getChildTagValue(tag, "nome");
            String data = getChildTagValue(tag, "data");
            int cpf = Integer.parseInt(getChildTagValue(tag, "cpf"));
            int ci = Integer.parseInt(getChildTagValue(tag, "ci"));
            Usuario user = new Usuario(nome, data, cpf, ci);
            lista.add(user);
        }
        return lista;
    }
    
    public void exportaLivro (ArrayList<Livro> lista, String path) throws IOException{
        try{
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
            DocumentBuilder db = dbf.newDocumentBuilder();  
            DOMImplementation impl = db.getDOMImplementation();
            Document doc = impl.createDocument(null,null,null);
            Element biblio = doc.createElement("biblio");
            for(int i=0; i<lista.size(); i++){
                Element livro = doc.createElement("livro");
                Livro l = (Livro) lista.get(i);
                // livro(id, autor, título, editora, isbn, ano
                //------
                Element titulo = doc.createElement("titulo");
                titulo.setTextContent(l.getTitulo());
                livro.appendChild(titulo);
                //------
                Element autor = doc.createElement("autor");
                autor.setTextContent(l.getAutor());
                livro.appendChild(autor);
                //------
                Element editora = doc.createElement("editora");
                editora.setTextContent(l.getEditora());
                livro.appendChild(editora);
                //------
                Element isbn = doc.createElement("isbn");
                isbn.setTextContent(String.valueOf(l.getAno()));
                livro.appendChild(isbn);
                //------
                Element ano = doc.createElement("ano");
                ano.setTextContent(String.valueOf(l.getAno()));
                livro.appendChild(ano);
                biblio.appendChild(livro);
                //System.out.println(i + ". " +l.getAutor() + " " + l.getEditora() + " " + l.getIdLivro());
           }
           doc.appendChild(biblio);
           TransformerFactory tfactory = TransformerFactory.newInstance();
           Transformer t = tfactory.newTransformer();
           t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
           t.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
           t.setOutputProperty(OutputKeys.INDENT,"yes");
           StringWriter escritor = new StringWriter();
           StreamResult resultado = new StreamResult(escritor);
           DOMSource fonte = new DOMSource(doc);
           t.transform(fonte, resultado);
           String teste = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n" + escritor.toString();
           //System.out.println(teste);
           File arquivo = new File(path);
           try (
                 FileOutputStream f = new FileOutputStream(arquivo)) {
                 f.write(teste.getBytes());
            }}catch(ParserConfigurationException | DOMException | TransformerFactoryConfigurationError | IllegalArgumentException | TransformerException | IOException e) {
       }}
    
    public void exportaUsuario (ArrayList<Usuario> lista, String path){
        try{
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
            DocumentBuilder db = dbf.newDocumentBuilder();  
            DOMImplementation impl = db.getDOMImplementation();
            Document doc = impl.createDocument(null,null,null);
            Element usuarios = doc.createElement("usuarios");
            for(int i=0; i<lista.size(); i++){
                Element user = doc.createElement("user");
                Usuario dado = (Usuario) lista.get(i);
                // usuario(id,nome; dataNasc; cpf; ci;)
                //------
                Element nome = doc.createElement("nome");
                nome.setTextContent(dado.getNome());
                user.appendChild(nome);
                //------
                Element dataNasc = doc.createElement("dataNasc");
                dataNasc.setTextContent(dado.getNome());
                user.appendChild(dataNasc);
                //------
                Element cpf = doc.createElement("cpf");
                cpf.setTextContent(String.valueOf(dado.getCpf()));
                user.appendChild(cpf);
                //------
                Element ci = doc.createElement("ci");
                ci.setTextContent(String.valueOf(dado.getCi()));
                user.appendChild(ci);
                usuarios.appendChild(user);
            }
           doc.appendChild(usuarios);
           TransformerFactory tfactory = TransformerFactory.newInstance();
           Transformer t = tfactory.newTransformer();
           t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
           t.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
           t.setOutputProperty(OutputKeys.INDENT,"yes");
           StringWriter escritor = new StringWriter();
           StreamResult resultado = new StreamResult(escritor);
           DOMSource fonte = new DOMSource(doc);
           t.transform(fonte, resultado);
           String teste = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n" + escritor.toString();
           File arquivo = new File(path);
            try (
                 FileOutputStream f = new FileOutputStream(arquivo)) {
                 f.write(teste.getBytes());
            }}catch(ParserConfigurationException | DOMException | TransformerFactoryConfigurationError | IllegalArgumentException | TransformerException | IOException e) {
       }}
    }


